char *s1="hello";与char s2[]="hello";这两种定义字符串的方法有什么不一样的效果

来源:百度知道 编辑:UC知道 时间:2024/06/03 21:31:39

两者的区别悬殊!
char *s1="hello"这个是一个字符串常量,你可以像一个字符数组一样使用它,但是你不能更改这个字符串的值比如 s1[2]='e'这样不行,
char s2[]="hello";是一个字符串变量,可以被修改。

不过,这两者再作函数的形参的时候是完全等价的。
void function(char *pstr);
void function(char pstr[]);
可以相当绝对的说这两种完全等价,没有任何区别。

前者是指向字符串的指针,后者是字符数组。但是在实际使用中,数组名指向了数组的第一个字符,从这一点来说,二者并没有本质的区别。

第一个是指针形式的 第二个是一般的数组 就效果来说是一样的 第一个可以用指针引用 在应用的时候会有一些小的区别 如 scnaf(%d,s2 )

你好:
让我来深入浅出的回答这个问题,让你能彻底明白的;

(1)"hello"是什么?
它是一个字符串常量,注意字符串在c语言中是没有变量一说的,

(2)"hello"在内存中如何存放?
它象一般的数组一样,没每一个内存小格子存放一个字母,这样顺序排下来,很显然字母h就是头

(3)char *s 是什么?
很显然它就是一个指针变量,这个s就是用来存放字符地址的,在我们这里,它就存放了字符h的内存地址!!也就是这个字符串的首地址。

(4)有了这个首地址我们输出的时候,首先找到首地址,然后依次读出后面的字符,直到遇到'\0'结束,所以你可想而知,这个字符串的长度就是6,因为系统自动加上了‘\0'

(5)char s2[]="hello"是什么?
它就是一个名字是s2的字符数组,存放了h,e,l,l,o,这5个字符,很显然它的长度是5,这也正是和前者的区别所在.

呵呵,打完收工

祝你好